package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**包位置：java.io
 * RandomAccessFileAPI
 *
 * 专门解决File无法实现读写的操作类【数据传递】，底层使用C完成
 *
 * 【使用方法并不方便】---晓得
 *
 * RandomAccessFile构造器使用
 *
 * new RandomAccessFile("文件路径","r代表读,rw代表读写")
 *
 * RandomAccessFile方法的使用：读、写操作
 *
 * 需求：实现音乐 C V 复制 粘贴
 *
 *
 *
 *
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建RAF类:在API项目文件下 直接创建raf.txt文件,模式：读写
        RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
        /**
         * write()
         * 作用：写出一个字节,将给定的int值对应2进制的"低8位"写出
         * 该方法有异常，范围：0~255之间---写入ASCII码【接近底层】
         * 抛出异常：抛出IO异常---有可能存在文件无法写出的情况
         */
        raf.write(97);  //a
        raf.write(98);  //b
        raf.write(101); //e
        //关闭流 closed() 防止内存消耗
        raf.close();
        System.out.println(raf);
    }

    @Test
    public void testRead() throws IOException {
        //创建RAF类---模式：r
        RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");
        /**
         * read()
         * 作用：读取一个字节，返回10进制值，如果返回值-1，代表读取末尾
         */
        int a = raf.read();
        int b = raf.read();
        int e = raf.read();
        int c = raf.read();
        System.out.println("读取到：" + a + "" + b + "" + e + "" + c);
    }


    //需求：实现音乐 C V 复制 粘贴

    @Test
    public void testCopy() throws IOException {
        //1.被复制的文件--复制操作---模式：r
        RandomAccessFile src = new RandomAccessFile("复制文件.mp4", "r");
        //1.复制出来的新文件--粘贴操作---模式：rw
        RandomAccessFile desc = new RandomAccessFile("试试.mp4", "rw");

        //2.创建变量类型：int类型--①用于保存读取/写出的每个字节
        int temp = -1;    //读取：②读到-1代表文件数据读完了
        //5.【一个字节一个字节的读---一个字节一个字节的写】测试运行效率
        long start = System.currentTimeMillis();
        //获取系统时间：毫秒

        //3.从“小跳蛙.mp3”---读到每个字节--写出"心跳蛙.mp3"
        //思考：一直从"小跳蛙.mp3"读到所有字节
        //从"小跳蛙.mp3"读到所有字节，只要不是末尾！=-1 一直
        while ((temp = src.read()) != -1) { //如果有数据：true
            //4.写出【心跳蛙.MP3】每个字节
            desc.write(temp);   //读入temp数据写出write

        }


        long end = System.currentTimeMillis();                        //毫秒数


        //6.关闭流
        src.close();
        desc.close();
        //7.读取花费时间
        System.out.println("读取花费时间：" + (end - start) + "毫秒数");
    }


    /**
     * 读写按照1个字节操作---效率低
     * 1024  程序员节
     * 1字节=8位二进制
     * 0   0000  0000
     * 1   0000  0001
     * 2   0000   0010
     * 6    0000   0110
     * 1024字节=1KB
     * 1024KB=1MB
     * 1024MB=1G
     * 1024G=1T
     * 读写按照100KB 操作--效率低
     */

    @Test
    public void testRW() throws IOException {
        //1.被复制文件--抖音--占用内存空间大
        RandomAccessFile src=new RandomAccessFile("抖音.mp4","r");
        //1.复制的文件--抖音.mp4
        RandomAccessFile desc=new RandomAccessFile("抖音11.mp4","rw");
        //2.保存每次读取的字节量
        int len=-1;
        /**重载
         * read() 一个字节一个字节读
         * read(字节数组）实现根据自己指定的  100KB 方式读取字节
         */
        //3.定义字节数组--100KB
        byte[] data=new byte[1024*100];
        //4.开始一直从“复制文件.mp4"读取
        // (len=src.read(data))!=-1  判断条件
        while ((len=src.read(data))!=-1){
            /**重载
             * write(int i) 写出一个字节
             * write(字节数组,读取开始：0，读取结束：-1)
             * 作用：写出"字节数组：指定大小100KB"的文件
             *      从0开始，写出到-1结束
             */
            //5.按照100KB 写出"抖音.mp4"文件
            desc.write(data,0,len);
            //6.关闭流

            //7.自己测复制的时间



        }
    }
}






